class Room(breve.Real):
	def __init__(self, dim, unit, botTypes, botCounts):
		breve.Real.__init__(self)
		self.unit = unit
		self.width = dim[0]
		self.height = dim[2]
		self.exit = breve.vector(5, 5, -5)
		self.delay = 10
		self.getController().pointCamera(
			breve.vector(self.width * unit / 2, 0, -self.height * unit / 2), 
			breve.vector(0, 200, self.height * unit))
		
		for x in range(0, self.width):
			Wall(breve.vector(x * unit + unit / 2, unit / 2, 0), 
				 breve.vector(unit, unit, .1))
			Wall(breve.vector(x * unit + unit / 2, unit / 2, -self.height * unit), 
				 breve.vector(unit, unit, .1))
		
		for z in range(0, self.height):
			Wall(breve.vector(0, unit / 2, -z * unit - unit / 2), 
				 breve.vector(.1, unit, unit))
			Wall(breve.vector(self.width * unit, unit / 2, -z * unit - unit / 2), 
				 breve.vector(.1, unit, unit))

		#for z in range(0, self.height):
			#for x in range(0, self.width):
				#Ground(breve.vector(x * unit + unit / 2, 0, -z * unit - unit / 2), 
					   #breve.vector(unit, .1, unit))
				
		Ground(breve.vector((self.width / 2) * unit, 0, -(self.height / 2) * unit), 
					   breve.vector(self.width * unit, .1, self.height * unit))	
		
		botCount = 0
		for c in range(0, len(botCounts)):
			botCount += botCounts[c]
		
		if botCount > self.width * self.height:
			print "Too many bots!"
		self.placeBots(botTypes, botCounts)
		
		BlackHole(unit).move(self.exit)	

	def placeBots(self, botTypes, botCounts):
		positions = []
		positionCount = self.width * self.height
		
		for i in range(0, positionCount):
			positions.append(True)

		while len(botCounts) > 0:
			while True:
				spot = random.randint(0, positionCount - 1)
				if positions[spot]: break
				
			positions[spot] = False	
			bot = botTypes[0]()
			bot.move(breve.vector(
				int(spot % self.height) * self.unit + self.unit / 2, self.unit / 2, 
			   -int(spot / self.height) * self.unit - self.unit / 2))
			bot.unit = self.unit
			bot.setShape(breve.createInstances(breve.Cube, 1).initWith(
				breve.vector(self.unit, self.unit, self.unit)))
			bot.setNeighborhoodSize(self.unit * 2)
			
			if isinstance(bot, ExitBot):
				bot.exit = self.exit
				bot.delay = self.delay
				bot.maxDelay = self.delay
				bot.setShape(breve.createInstances(breve.Sphere, 1).initWith(self.unit / 2))
				bot.setColor(breve.randomExpression(breve.vector(1, 1, 1)))
				bot.getOut = True
			
			botCounts[0] -= 1
			if botCounts[0] == 0:
				botCounts.pop(0)
				botTypes.pop(0)
			
	def setExit(self, exit):
		self.exit = breve.vector(exit[0] * unit + unit / 2, unit / 2, -exit[1] * unit - unit / 2)
	
	def setDelay(self, delay):
		self.dealy = delay

	def getWidth(self): return self.width
	def getHeight(self): return self.height
	def getUnit(self): return self.unit
	
class Obstruction(breve.Stationary):
	def __init__(self, position, dimension, color):
		breve.Stationary.__init__(self)
		self.setTexture(-1)
		self.setShape(breve.createInstances(breve.Cube, 1).initWith(dimension))
		self.setColor(color)
		self.move(position)
	
class Wall(Obstruction):
	def __init__(self, position, dimension):
		Obstruction.__init__(self, position, dimension, breve.vector(1.0, 1.0, 1.0))
		#self.setBitmapTransparency(0.5)	
		
class Ground(Obstruction):
	def __init__(self, position, dimension):
		Obstruction.__init__(self, position, dimension, breve.vector(0.0, 0.3, 0.0))
		#self.setBitmapTransparency(0.5)
		
class BlackHole(breve.Mobile):
	def __init__(self, unit):
		breve.Mobile.__init__(self)
		self.setNeighborhoodSize(unit / 2)
		self.setColor(breve.vector(0, 0, 0))	
		
	def iterate(self):	
		breve.Mobile.iterate(self)
		self.neighborList = self.getNeighbors()
		while len(self.neighborList) > 0: 
			breve.deleteInstance(self.neighborList.pop())		